**Mean Shift(均值偏移)**是一種非參數化的聚類演算法,與 K-Means 不同的是,Mean Shift 不需要預先指定聚類的數量。Mean Shift 的核心思想是通過迭代地將每個數據點向其周圍密度最大的區域移動,從而找到數據點的密度峰值(即模式)。
核密度估計(KDE): Mean Shift 使用核密度估計來估算數據點的密度。常見的選擇是高斯核(Gaussian Kernel),但也可以根據應用場景選擇其他核函數。
帶寬(Bandwidth): 帶寬參數決定了每次移動時考慮的區域半徑。帶寬的選擇非常關鍵,會影響聚類的顆粒度。如果帶寬太大,可能會識別出較少的聚類;而如果帶寬太小,可能會產生過多的小聚類。
移動過程:
收斂與聚類: 在收斂之後,相近的點會被認為屬於同一個聚類。那些收斂到相同模式(密度峰值)的點會被分配到同一個聚類。
from sklearn.datasets import load_iris
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
iris = load_iris()
X = iris.data
df = pd.DataFrame(X, columns=iris.feature_names)
from sklearn.cluster import MeanShift
mean_shift = MeanShift()
mean_shift.fit(X)
labels = mean_shift.labels_
df['Cluster'] = labels
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.title('鳶尾花數據集的 Mean Shift 聚類')
plt.xlabel(iris.feature_names[0])
plt.ylabel(iris.feature_names[1])
plt.show()